package org.kgduyjj.toolkit.beans;

import java.util.Objects;

/**
 * 数字有效值范围
 * 
 * @author Kgduyjj
 *
 */
public final class NumberRange {
    private final Number min;
    private final Number max;

    /**
     * 私有化构造方法
     * 
     * @param min
     * @param max
     */
    private NumberRange(Number min, Number max) {
        Objects.requireNonNull(min);
        Objects.requireNonNull(max);
        this.min = min;
        this.max = max;
    }

    /**
     * 构建一个数值比较对象
     * 
     * @param min
     * @param max
     * @return
     */
    public static NumberRange of(double min, double max) {
        if (!isValidValue(min)) {
            throw new IllegalArgumentException("最小值已超出数值边界");
        }
        if (!isValidValue(max)) {
            throw new IllegalArgumentException("最大值已超出数值边界");
        }
        if (min > max) {
            throw new IllegalArgumentException("最小值必须要比最大值小");
        }
        return new NumberRange(min, max);
    }

    /**
     * 校验数据是否支持，当前支持数值类型：[ {@link Double} , {@link Integer} , {@link Long} ]
     * 
     * @param value
     * @return
     */
    public static boolean isValidValue(Number value) {
        if (null == value) {
            return false;
        }
        if (value instanceof Double) {
            return (value.doubleValue() >= Double.MIN_VALUE && value.doubleValue() <= Double.MAX_VALUE);
        } else if (value instanceof Integer) {
            return (value.intValue() >= Integer.MIN_VALUE && value.intValue() <= Integer.MAX_VALUE);
        } else if (value instanceof Long) {
            return (value.longValue() >= Long.MIN_VALUE && value.longValue() <= Long.MAX_VALUE);
        } else {
            return false;
        }
    }

    public boolean checkBounds(double value) {
        if (isValidValue(value)) {
            return (value >= min.doubleValue() && value <= max.doubleValue());
        }
        return false;
    }
}
